<?php
    namespace Utils\Couleur;
    /**
    * Cette classe permet de définir ce que pourra faire une Couleur
    */
    abstract class Couleur {
        /**
        * Convertit un objet Couleur en un objet CouleurHexa
        * 
        * @return \Couleur\CouleurHexa
        */
        public function toHexa() {
            if($this instanceof CouleurRGB) {
                $string = '#';
                $string .= dechex($this->rouge);
                $string .= dechex($this->vert);
                $string .= dechex($this->bleu);
                $couleur = new CouleurHexa($string);
            }
            else {
                $couleur = $this;
            }
            return $couleur;
        }
        /**
        * Convertit un objet Couleur en un objet CouleurRGB
        * 
        * @return \Couleur\CouleurRGB
        */
        public function toRGB() {
            if($this instanceof CouleurHexa) {
                //On enlève tout les caractères qui ne rentrent pas dans la composition d'une chaine Hexadecimale
                $hexStr = preg_replace("/[^0-9A-Fa-f]/", '', $this->hexa);
                $rgbArray = array();
                if (strlen($hexStr) === 6) { //If a proper hex code, convert using bitwise operation. No overhead... faster
                    $colorVal = hexdec($hexStr);
                    $rgbArray['rouge'] = 0xFF & ($colorVal >> 0x10);
                    $rgbArray['vert'] = 0xFF & ($colorVal >> 0x8);
                    $rgbArray['bleu'] = 0xFF & $colorVal;
                } 
                elseif (strlen($hexStr) == 3) { //if shorthand notation, need some string manipulations
                    $rgbArray['rouge'] = hexdec(str_repeat(substr($hexStr, 0, 1), 2));
                    $rgbArray['vert'] = hexdec(str_repeat(substr($hexStr, 1, 1), 2));
                    $rgbArray['bleu'] = hexdec(str_repeat(substr($hexStr, 2, 1), 2));
                }
                $couleur = new CouleurRGB($rgbArray['rouge'], $rgbArray['vert'], $rgbArray['bleu']);
            }
            else {
                $couleur = $this;
            }
            return $couleur;
        }
        /**
        * Retourne la chaine de caractère nécessaire pour afficher la couleur dans un élément html
        * 
        * @return string
        */
        public function __toString() {
            $couleur = $this->toHexa();
            return 'color:'.$couleur->getHexa().';';
        }
    }
?>